package org.pps.gl.server.datastore;

import java.util.List;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

/**
 * Cette classe prend en charge toutes les operations CRUD en rapport avec
 * l'entitée Profil.
 * 
 * Un profil a les propriétés suivantes : - email_user : email de l'utilisateur
 * - statut : statut de l'utilisateur.
 * 
 * 
 */
public class Profil {

	/**
	 * Créer ou met a jour un profil pour un User spécifique.
	 * 
	 * @param emailUser
	 *            : email de l'utilisateur concerné.
	 * @param statut
	 *            : String représentant le statut de l'utilisateur.
	 * @return la nouvelle entité créée.
	 */
	public static Entity createOrUpdateProfil(Entity user, String emailUser,
			String statut) {

		if (user != null) {
			Entity profil = (Entity) user.getProperty("Profil");

			if (profil == null) {
				profil = new Entity("Profil", user.getKey());
				profil.setProperty("email_user", emailUser);
			}

			profil.setProperty("statut", statut);

			Util.persistEntity(profil);

			return profil;
		} else
			return null;
	}

	/**
	 * Méthode qui permet la mise à jour d'une propriété du profil.
	 * 
	 * @param profil
	 * @param property
	 *            : Propriété à mettre à jour.
	 * @param value
	 *            : Nouvelle valeur.
	 */
	public static void updateProfil(Entity profil, String property, String value) {

		// Mise à jour de la propriété
		profil.setProperty(property, value);
		Util.persistEntity(profil);
	}

	/**
	 * Fonction qui rajoute une étude à un profil.
	 * 
	 * @param profil
	 * @param periode
	 */
	public static void addEtude(Entity profil, String periode, String email_user) {
		Etude.createEtude(profil, periode, email_user);

	}

	/**
	 * Fonction qui va renvoyer la liste des études pour un profil spécifique.
	 * 
	 * @param profil
	 * @return
	 */
	public static Iterable<Entity> getEtudes(String emailUser) {
		return (Etude.getEtudesForProfil(emailUser));
	}

	/**
	 * Fonction qui renvoie le statut d'un profil spécifique.
	 * 
	 * @param profil
	 * @return
	 */
	public static String getStatut(Entity profil) {
		return (String) profil.getProperty("statut");
	}

	/**
	 * Récupère le profil correspondant à l'email d'un user.
	 * 
	 * @param emailUser
	 *            : email d'un user
	 * @return profil entity
	 */
	public static Entity getProfil(String emailUser) {
		Query query = new Query("Profil");
		query.addFilter("email_user", FilterOperator.EQUAL, emailUser);
		List<Entity> results = Util.getDatastoreServiceInstance()
				.prepare(query).asList(FetchOptions.Builder.withDefaults());
		if (!results.isEmpty()) {
			return (Entity) results.remove(0);
		}
		return null;
	}

	/**
	 * Efface le profil d'un utilisateur et en cascade toutes les entités
	 * filles.
	 * 
	 * @param userEmail
	 *            : email d'un utilisateur.
	 */
	public static String deleteProfil(Entity profil) {

		if (profil != null) {

			// Effacer études
			Iterable<Entity> sesEtudes = getEtudes((String)profil.getProperty("email_user"));
			if (null != sesEtudes)
				for (Entity e : sesEtudes)
					Etude.deleteEtude(e);

			// Effacer les experiences pro
			Iterable<Entity> sesExperiences = Experience_Pro
					.getExperienceForUser((String)profil.getProperty("email_user"));

			if (null != sesExperiences)
				for (Entity e : sesExperiences)
					Experience_Pro.deleteExperience(e);

			// En tout dernier on efface le profil.
			Util.deleteEntity(profil.getKey());

			return ("Profil deleted successfully.");
		} else
			return ("Profil not found");
	}

}
